package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.model.dto.MobileOrderPageDTO;
import com.ssy.lingxi.order.model.dto.MobileOrderQueryDTO;
import com.ssy.lingxi.order.model.vo.mobile.response.MobileOrderDetailVO;
import com.ssy.lingxi.order.model.vo.mobile.response.MobileVendorOrderDetailVO;

import java.util.List;

/**
 * App - 基础订单服务接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-09-22
 */
public interface IBaseMobileOrderService {
    /**
     * 订单是否没有被取消或没有被中止
     * @param query 订单查询DTO
     * @return true-没有被取消或中止，false-已经被取消或中止
     */
    Boolean notCancelledOrTerminated(MobileOrderQueryDTO query);

    /**
     * 订单是否能调整送货时间
     * @param query 订单查询DTO
     * @return true-是， false-否
     */
    Boolean canBuyerModifyDeliverTime(MobileOrderQueryDTO query);

    /**
     * 订单是否能退款
     * @param query 订单查询DTO
     * @return true-是， false-否
     */
    Boolean canBuyerRefundOrder(MobileOrderQueryDTO query);

    /**
     * 订单是否能“售后”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderAfterSale(MobileOrderQueryDTO query);

    /**
     * 订单是否能“归档”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderArchive(MobileOrderQueryDTO query);

    /**
     * 订单是否能“再次购买”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderAgain(MobileOrderQueryDTO query);

    /**
     * 订单是否能“取消”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderCancel(MobileOrderQueryDTO query);

    /**
     * 订单是否能“评论”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderComment(MobileOrderQueryDTO query);

    /**
     * 订单是否能“确认电子合同”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderConfirmContract(MobileOrderQueryDTO query);

    /**
     * 订单是否能“确认采购收货单”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderConfirmReception(MobileOrderQueryDTO query);

    /**
     * 订单是否能“新增采购收货单”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderCreateReception(MobileOrderQueryDTO query);

    /**
     * 订单是否能“支付”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderPay(MobileOrderQueryDTO query);

    /**
     * 订单是否能“确认收货”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderReceive(MobileOrderQueryDTO query);

    /**
     * 订单是否能“提交”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderSubmit(MobileOrderQueryDTO query);

    /**
     * 订单是否能“一级审核”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderValidateGradeOne(MobileOrderQueryDTO query);

    /**
     * 订单是否能“二级审核”
     * @param query 订单查询DTO
     * @return 是-true，否-false
     */
    Boolean canOrderValidateGradeTwo(MobileOrderQueryDTO query);

    /**
     * 判断采购商是否能删除订单
     * @param query 订单查询DTO
     * @return true-是，false-否
     */
    Boolean canBuyerDeleteOrder(MobileOrderQueryDTO query);

    /**
     * 分页查询采购订单
     * @param buyerMemberId    采购会员Id
     * @param buyerRoleId      采购会员角色Id
     * @param keyword          订单编号/供应会员/订单摘要
     * @param buyerInnerStatus 采购会员内部状态
     * @param outerStatus      订单外部状态
     * @param current          当前页
     * @param pageSize         每页行数
     * @return 查询结果
     */
    MobileOrderPageDTO pageMobileBuyerOrders(Long buyerMemberId, Long buyerRoleId, String keyword, Integer buyerInnerStatus, Integer outerStatus, int current, int pageSize);

    /**
     * 分页查询采购订单
     * @param buyerMemberId    采购会员Id
     * @param buyerRoleId      采购会员角色Id
     * @param keyword          订单编号/供应会员/订单摘要
     * @param startDate        订单起始日期
     * @param endDate          订单结束日期
     * @param buyerInnerStatus 采购会员内部状态
     * @param outerStatus      订单外部状态
     * @param current          当前页
     * @param pageSize         每页行数
     * @return 查询结果
     */
    MobileOrderPageDTO pageMobileBuyerOrders(Long buyerMemberId, Long buyerRoleId, String keyword, String startDate, String endDate, Integer buyerInnerStatus, Integer outerStatus, int current, int pageSize);

    /**
     * 分页查询“待支付”的采购订单
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param keyword       订单编号/供应会员/订单摘要
     * @param current       当前页
     * @param pageSize      每页行数
     * @return 查询结果
     */
    MobileOrderPageDTO pageMobileToPayOrders(Long buyerMemberId, Long buyerRoleId, String keyword, int current, int pageSize);

    /**
     * 查询订单详情
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param orderId       订单Id
     * @return 查询结果
     */
    Wrapper<MobileOrderDetailVO> findMobileOrderDetail(Long buyerMemberId, Long buyerRoleId, Long orderId);

    /**
     * 分页查询销售订单
     * @param vendorUserId  登录用户id
     * @param buyerMemberId 采购会员Id
     * @param buyerRoleId   采购会员角色Id
     * @param month         下单月份
     * @param memberName    采购会员名称
     * @param orderType     订单类型
     * @param current       当前页
     * @param pageSize      每页行数
     * @return 查询结果
     */
    MobileOrderPageDTO pageMobileVendorOrders(Long vendorUserId, Long buyerMemberId, List<Long> buyerRoleId, String month, String memberName, Integer orderType, int current, int pageSize);

    /**
     * 查询销售订单详情
     * @param orderId        订单Id
     * @return 查询结果
     */
    Wrapper<MobileVendorOrderDetailVO> getMobileVendorOrderDetail(Long orderId);

    /**
     * 订单审核 - 分页查询销售订单
     * @param vendorUserId      登录用户id
     * @param buyerMemberId     采购会员Id
     * @param buyerRoleId       采购会员角色Id
     * @param keyword           订单编号/供应会员
     * @param vendorInnerStatus 供应会员内部状态
     * @param current           当前页
     * @param pageSize          每页行数
     * @return 查询结果
     */
    MobileOrderPageDTO pageMobileVendorValidateOrders(Long vendorUserId, List<Long> buyerMemberId, List<Long> buyerRoleId, String keyword, Integer vendorInnerStatus, int current, int pageSize);
}
